import java.awt.Frame;
import java.util.Calendar;
import javax.swing.SpinnerDateModel;
/**
 * Klasa kontrolera okna dialogowego służącego do edycji i dodawania wydarzeń.
 * @author krzys
 *
 */

public class EventDialog{
	/**Pole przechowujące widok okna dialogowego*/
	private EventDialogView dView;
	/**Pole przechowujące model okna dialogowego*/
	private EventDialogModel dModel;

	/**
	 * Dodaje wydarzenie przeznaczone do edycji do wewnętrzenej struktury okna.
	 * @param e Wydarzenie przeznaczone do edycji.
	 * @param position Indeks opisujący położenie w źródłowej ArrayList.
	 */
	public void addEvent(Event e, int position)
	{
		dModel.getEventsInCell().add(e);
		dModel.getIndexes().add(new Integer(position));
		dView.eventSelector.addItem(dModel.getEventsInCell().get(dModel.getEventsInCell().size()-1).getName());
	}
	/**
	 * Ustawia pola okna dialogowego na pobrane ze struktury Event.
	 * @param e Obiekt klasy Event, który będzie przedstawiony w oknie dialogowym.
	 */
	void setFields(Event e)
	{
		dView.summaryField.setText(e.getName());
		dView.LocationField.setText(e.getLocation());
		dView.description.setText(e.getDescription());
		int h = e.getEventStart().get(Calendar.HOUR_OF_DAY)*2+e.getEventStart().get(Calendar.MINUTE)/30;
		dView.startDateSelector.setValue(e.getEventStart().getTime());
		dView.startHourSelector.getModel().setValue(dModel.getHours()[h]);
		h = e.getEventEnd().get(Calendar.HOUR_OF_DAY)*2+e.getEventEnd().get(Calendar.MINUTE)/30;
		dView.endDateSelector.setValue(e.getEventEnd().getTime());
		dView.endHourSelector.getModel().setValue(dModel.getHours()[h]);
		dView.priority.setSelectedIndex(e.getPriority());
		dView.remindSelector.setValue(new Integer(e.getRemind()));
	}
	/**
	 * Ustawia datę początkową i datę końcową o 30 min późniejszą w oknie dialogowym.
	 * @param c Data początkowa.
	 */
	public void setDate (Calendar c)
	{
		int h = c.get(Calendar.HOUR_OF_DAY)*2+c.get(Calendar.MINUTE)/30;
		dView.startDateSelector.setValue(c.getTime());
		dView.startHourSelector.getModel().setValue(dModel.getHours()[h]);
		
		if (h<47)
		{
			dView.endDateSelector.setValue(c.getTime());
			dView.endHourSelector.getModel().setValue(dModel.getHours()[h+1]);
		}
		else
		{
			c.set(Calendar.DAY_OF_MONTH, c.get(Calendar.DAY_OF_MONTH)+1);
			dView.endDateSelector.setValue(c.getTime());
			dView.endHourSelector.getModel().setValue(dModel.getHours()[0]);
			
		}
	}
	private int indexOf (String s)
	{
		for (int i = 0 ; i<48 ; i++)
		{
			if (dModel.getHours()[i].equals(s)) return i;
		}
		return 0;
	}
	/**
	 * Pobiera pola formularza wprowadzone przez użytkownika.
	 * @return Struktura Event z ustawionymi polami.
	 */
	public Event getFields ()
	{
		Event e = new Event();
		Calendar ctmp=Calendar.getInstance();
		e.setName(dView.summaryField.getText());
		e.setLocation(dView.LocationField.getText());
		SpinnerDateModel m = (SpinnerDateModel)dView.startDateSelector.getModel();
		int t = indexOf((String)dView.startHourSelector.getModel().getValue());
		ctmp.setTime(m.getDate());
		e.setEventStart(ctmp.get(Calendar.YEAR), ctmp.get(Calendar.MONTH), ctmp.get(Calendar.DAY_OF_MONTH), t/2, t%2*30);
		m = (SpinnerDateModel)dView.endDateSelector.getModel();
		ctmp.setTime(m.getDate());
		t = indexOf((String)dView.endHourSelector.getModel().getValue());
		e.setEventEnd(ctmp.get(Calendar.YEAR), ctmp.get(Calendar.MONTH), ctmp.get(Calendar.DAY_OF_MONTH), t/2, t%2*30);
		e.setRemind(dView.remindModel.getNumber().intValue());
		e.setPriority(dView.priority.getSelectedIndex());
		e.setDescription(dView.description.getText());
		return e;
	}
	/**
	 * Pobiera indeks wektora źródłowego z którego pobrano obiekt klasy Event do edycji.
	 * @return indeks
	 */
	public int getEditedIndex ()
	{
		return dModel.getIndexes().get(dView.eventSelector.getSelectedIndex()).intValue();
		
	}
	/**
	 * Inicjalizuje obiekt klasy EventDialog oraz inicjalizuje widok oraz model dla niego.
	 * @param owner	Rodzic okna dialogowego.
	 * @param title Tytuł okna dialogowego.
	 */
	EventDialog (Frame owner, String title)
	{
		dModel = new EventDialogModel();
		dView = new EventDialogView(owner,title,this);
		
			
	}
	/**
	 * Ustawia flagę wykonania okna. true jeżeli naciśnięto ok, false jeżeli anuluj. 
	 * @param f Flaga opisująca stan.
	 */
	public void setExecutedFlag (boolean f)
	{
		dModel.setExecuted(f);
		return;
	}
	/**
	 * Przeładowuje pola jeżeli zmieniono aktualnie edytowane wydarzenie.
	 * @param index Indeks w wektorze źródłowym z ktorego wydarzenie jest poddawane edycji. 
	 */
	public void eventReload (int index)
	{
		setFields(dModel.getEventsInCell().get(index));
	}
	/**
	 * Wyświetla okno dialogowe.
	 * @return true jeżeli naciśnięto ok. false jeżeli naciśnięto cancel.
	 */
	public boolean exec()
	{
		if (dModel.getEventsInCell().size()>0)
		{
			dView.eventSelector.setVisible(true);
			dView.eventLabel.setVisible(true);
		}
		dView.setVisible(true);
		return dModel.isExecuted();	
	}

}
